package com.lsq.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @ClassName: DateUtil
 * @Description: 日期工具类
 * @author: charles
 * @date: 2021年7月20日 下午7:39:45
 */
public class DateUtil {
	/**
	 * 功能：根据生日计算年龄 示例：现在是2020-4-23，如果生日是2020-5-20，那结果是19
	 * 
	 * @param Date，生日
	 * @return int 年龄
	 */
	public static int getAge(Date birthday) {
		// 获取当前系统日期
		Calendar c = Calendar.getInstance();
		int now_year = c.get(Calendar.YEAR);// 当前年
		int now_month = c.get(Calendar.MONTH);// 当前月
		int now_day = c.get(Calendar.DAY_OF_MONTH);// 当前日
		// 获取生日的年月日
		c.setTime(birthday);
		int b_year = c.get(Calendar.YEAR);// 生日年
		int b_month = c.get(Calendar.MONTH);// 生日月
		int b_day = c.get(Calendar.DAY_OF_MONTH);// 生日

		int age = 0;

		age = now_year - b_year;
		if (now_month < b_month) // 还没有到生日的月份
			age--;
		else if (now_month == b_month && now_day < b_day)
			age--;

		return age;
	}

	/**
	 * 功能：给定时间对象，获取该时间的月初1日0时0分0秒0毫秒 示例：2018-11-11 08:30:16 → 2018-11-01
	 * 00:00:00 使用场景：可用在数据库里查询某月的时间范围
	 *
	 * @param Date
	 *            源时间
	 * @return Date 月初时间
	 */
	public static Date getFirstDayOfMonth(Date src) {
		Calendar c = Calendar.getInstance();
		c.setTime(src);// 用传入的日期初始化日历类
		// 设置日历的日期为月初时间
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);
		return c.getTime();// 从日历获取日期
	}

	/**
	 * 功能：给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒 示例：2018-11-11 08:30:16 → 2018-11-30
	 * 23:23:59 使用场景：可用在数据库里查询某月的时间范围
	 *
	 * @param Date
	 *            源时间
	 * @return Date 月末时间
	 */
	public static Date getLastDayOfMonth(Date src) {
		// 获取当前日期的月初时间 ， 再让月份+1 计算出下月月初 ----再减去1秒
		Calendar c = Calendar.getInstance();
		c.setTime(src);// 用传入的日期初始化日历类
		// 把日历的日期设置为下个月月初 ，
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, 1, 0, 0, 0);

		// -再减去1秒
		c.add(Calendar.SECOND, -1);

		return c.getTime();
	}

	/**
	 * 功能：获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	 * 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	 * 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	 * 
	 * @param int
	 *            days 偏移的天数，如果为负数则往前回滚。
	 * @return Date 新日期
	 */
	public static Date offsetDate(int days) {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();
	}

	/**
	 * 
	 * @Title: offsetDate
	 * @Description: 让指定的日期+指定的天数
	 * @param date
	 * @param days
	 * @return
	 * @return: Date
	 */
	public static Date offsetDate(Date date, int days) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();

	}

	/**
	 * 
	 * @Title: offsetMonth
	 * @Description: 让指定的日期+指定月份
	 * @param date
	 * @param months
	 * @return
	 * @return: Date
	 */
	public static Date offsetMonth(Date date, int months) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, months);
		return c.getTime();

	}

	/**
	 * 功能：获取当前季节，如春季、夏季、秋季、冬季。
	 * 
	 * @return Season 季节
	 */
	public static Season getCurrentSeason() {
		Calendar c = Calendar.getInstance();
		int month = c.get(Calendar.MONTH) + 1;
		// 3～5月为春季，6～8月为夏季，9～11月为秋季，12月～来年2月为冬季
		if (month >= 3 && month <= 8) {
			if (month > 5)
				return Season.SUMMBER;
			return Season.SPRING;
		} else {
			if (month >= 9 && month <= 11)
				return Season.AUTOMN;
			return Season.WINTER;
		}

	}

	/**
	 * 功能：获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	 *
	 * @param Date
	 *            date 源时间。
	 * @return 人性化时间
	 */
	public static String getDisplayTime(Date date) {

		long t1 = date.getTime();// 从1970年到date日期的毫秒值
		long t2 = new Date().getTime();// 从1970年到现在日期的毫秒值
		long t3 = t2 - t1;
		long m = t3 / 1000 / 60; // 两个日期差值 -转为分钟
		
		if(m<=5)
		 return "刚刚";
		else if(m<60)
		return  m +"分钟前";
		else if(m/60<24)
			return m/60+"小时前";
		else if(m/60/24<30)
			return m/60/24+"天前";
		else if(m/60/24/30<12)
			return m/60/24/30 +"月前";
		return m/60/24/30/12+"年前";

	}
	
	/**
	 * 
	 * @Title: fmtDate 
	 * @Description: 格式化日期
	 * @param date
	 * @param pattern
	 * @return
	 * @return: String
	 */
	public static String fmtDateYMD(Date date){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(date);
	}
	
	
	/**
	 * 
	 * @Title: fmtDate 
	 * @Description: 格式化日期
	 * @param date
	 * @param pattern
	 * @return
	 * @return: String
	 */
	public static String fmtDateYMDHMS(Date date){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return format.format(date);
	}
	
	//计算出距离指定日期还有多少天 --如距离北京冬奥会还有多少天
	
	public static int getDays(Date date){
		return 0;
	}
	
}
